﻿using System;
using System.IO;
using System.Windows.Forms;
using System.Collections.Generic;

namespace BpmConnection2Sec
{
    class BPMLaunchProgram
    {
        //abilito il meccanimso di scelta
        public const int BPM_CONFIG_3270 = 0;
        private static Logger logger;
        public BPMLaunchProgram()
        {
            logger = Logger.getInstance();
            this.loadFilesPath();            
        }
        /// <summary>
        /// Scelta operativa
        /// </summary>
        /// <param name="choosen"></param>
        private void doChoose(int choosen, InfoUser user)
        {
            //la scelta
            Console.WriteLine();
            switch (choosen)
            {
                case BPM_CONFIG_3270:
                    {
                        Console.WriteLine("Scelto {0}", "" + BPM_CONFIG_3270);
                        Config3270 cfg = null;
                        if (user == null)
                        {
                            //arrivo dal processo interattivo
                            cfg = new Config3270();
                        }
                        else
                        {
                            cfg = new Config3270(user);
                        }

                        Console.WriteLine("Processo terminato con il seguente messaggio: {0}", cfg.make3270Configuration());
                        Console.WriteLine();
                        logger.logEndSession();
                    }; break;
            }
        }

        public void run(Char charChoosen, InfoUser user)
        {

            if (Char.IsNumber(charChoosen))
            {
                if (charChoosen == '0')
                {
                    this.doChoose(BPM_CONFIG_3270, user);
                }
                else
                {
                    Console.WriteLine("\n=====================================");
                    Console.WriteLine("Comando non trovato");
                }
            }
        }

        static void Main(string[] args)
        {
                       
            try
            {            
                BPMLaunchProgram p = new BPMLaunchProgram();
                logger.log("Application started...", "STD");
                //la cosa che si può aggiungere è legata al fato che l'utente
                //entri o meno con smartcard, che può determinare un cambio di configurazione

                //Se il file di lock esiste non faccio nememno la chiamata
                if (!File.Exists(Make3270CfgFile.LCK_3270_FILE_NAME))
                {
                    if (args.Length != 0)
                    {
                        logger.logStartSession();
                        logger.log("Credential passed as parameter", "STD");
                        //ci sono dei valori in cmd line: prendo solo il primo
                        string cmdChoosen = args[0];
                        //il primo parametro sta per la scelta del comando 
                        string username = null;
                        //il secondo parametro sta per la matricola utente
                        if (args.Length == 2)
                        {
                            username = args[1].ToUpper().Trim();
                        }
                        else
                        {
                            username = BPMLaunchProgram.getUserName();
                        }
                        //New infouser richiama il terminalWS per scaricare i dati
                        logger.log("Getting user [" + username + "] data...", "STD");
                        p.run(cmdChoosen.ToCharArray()[0], new InfoUser(username));
                        
                    }
                    else
                    {
                        logger.log("Read credential from command line", "STD");
                        ConsoleKeyInfo cki;
                        do
                        {

                            Console.WriteLine("=====================================");
                            Console.WriteLine("Scegli il servizio.");
                            Console.WriteLine("-------------------------------------");
                            Console.WriteLine("0   -> Imposta la configurazione 3270");
                            //Console.WriteLine("1   -> Ricalcola MD5 x la config 3270");
                            //Console.WriteLine("2   -> RE-Imposta la configurazi 3270");
                            Console.WriteLine("Esc -> quit");
                            Console.WriteLine("-------------------------------------");
                            Console.Write("Fai la tua scelta:");
                            cki = Console.ReadKey();
                            Char charChoosen = cki.KeyChar;
                            // get a char, fare una scelta 
                            //da commandline ragiono come se fosse lanciato per l'utente che è logon
                            //mentre in questo contesto devo richiedere di digitare la uid...
                            //cmq da verificare con SistDev
                            string username = "";
                            InfoUser infoUser = null;
                            if (Char.IsNumber(charChoosen) && (charChoosen == '0'))
                            //|| charChoosen == '1' || charChoosen == '2'))
                            {
                                logger.logStartSession();
                                username = getUsernameFromLine();
                                username = System.Environment.UserName;
                                logger.log("Username: " + username, "STD");
                                //New infouser richiama il terminalWS per scaricare i dati
                                logger.log("Getting user [" + username + "] data...", "STD");

                                infoUser = new InfoUser(username.ToUpper());//matricola di test CRD0011

                            }
                            p.run(charChoosen, infoUser);
                        } while (cki.Key != ConsoleKey.Escape);
                    }
                }
                else
                {
                    //Controllo per l'args (args[1].ToUpper().Trim())
                    string username = null;
                    if (args.Length == 2)
                    {
                        username = args[1].ToUpper().Trim();
                    }
                    else
                    {
                        username = BPMLaunchProgram.getUserName();
                    }
                    Config3270 cfg3270instance = new Config3270(username);                    
                    Dictionary<string, bool> needAnotherLoad = cfg3270instance.needAnotherLoad();
                    if (!needAnotherLoad["NEEDUPDATE"])
                    {
                        logger.log("La configurazione dell'utente è già presente.", "STD");
                    }
                    else {                      
                        if (needAnotherLoad["OU"]){
                            logger.log("La configurazione dell'utente deve essere aggiornata per cambio di unità organizzativa.", "STD");
                            //carico il file che c'è già nella directory specifica e lo modifico puntualmente
                            //per quel che riguarda i terminali
                            new Make3270CfgFile(new InfoUser(username)).update3270FileOrgUnitChanged();                            
                        }
                        if (needAnotherLoad["LOGONTYPE"])
                        {
                            logger.log("La configurazione dell'utente deve essere aggiornata per variazione nell'accesso sicuro.", "STD");
                            //cambio solo la porta di accesso sul file 3270.ws
                            //load del file
                            //Security da Y --> N
                            //HostPortNumber da 20023 a 23
                            //OpenMacro=logon.MAC va commentato --> #OpenMacro=logon.MAC);
                            /*
                             * if (!_isScAuth){
                             * Replace("HostPortNumber=20023", "HostPortNumber=23");
                             * Replace("Security=Y", "Security=N");
                             * Replace("OpenMacro=logon.MAC", "#OpenMacro=logon.MAC");
                            }*/
                            new Make3270CfgFile(new InfoUser(username, true)).update3270FileSmartCardLogon();                           
                        }
                        //Alla fine del cambio, aggiorno il lock
                        cfg3270instance.flushLock();
                    }
                    
                }
            }
            catch (Exception ex)
            {
                logger.log("Eccezione: " + ex.Message, "ERR");
                Environment.ExitCode = 1;
                System.Windows.Forms.MessageBox.Show(ex.Message, "APPLICATION ERROR", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
            }
        }

        private static string getUsernameFromLine()
        {
            string username = null;
            Console.Write("\n\nDigitare la matricola utente quindi premere invio: ");
            username = Console.ReadLine();
            if ("".Equals(username.Trim()))
            {
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("\nLa matricola NON può essere BLANK.");
                Console.ResetColor();
                username = getUsernameFromLine();
            }
            return username;
        }

        public static string getUserName()
        {
            return System.Environment.UserName;
        }


        //LETTURA DEI PATH DAL FILE DI CONFIGURAZIONE 
        private void loadFilesPath()
        {
            String line = null;
            System.IO.StreamReader file = null;
            try
            {
                file = new System.IO.StreamReader("terminalws.conf");
                while ((line = file.ReadLine()) != null)
                {
                    if (!line.StartsWith("#"))
                    {
                        String envvar = null;
                        String npath = null;
                        int par = line.IndexOf('=');
                        int envIndex = line.IndexOf('%');

                        //Se envIndex é <0 non c'è una variabile di ambiente
                        if (envIndex > 0)
                        {
                            String[] campi = line.Split('%');
                            envvar = campi[1];
                            npath = campi[2];
                        }
                        else
                        {
                            npath = line.Substring(par + 1);
                        }

                        if (line.StartsWith("[CFG_PATH]"))
                        {
                            String path1 = "";
                            if (envIndex > 0)
                            {
                                path1 = System.Environment.GetEnvironmentVariable(envvar);
                            }
                            Make3270CfgFile.updateCFGFilesPath(path1 + "" + npath);

                        }

                        if (line.StartsWith("[WS_PATH]"))
                        {
                            String path1 = "";
                            if (envIndex > 0)
                            {
                                path1 = System.Environment.GetEnvironmentVariable(envvar);

                            }
                            Make3270CfgFile.updateWSFilesPath(path1 + "" + npath);
                        }
                        if (line.StartsWith("[LOG_PATH]"))
                        {
                            String path1 = "";
                            if (envIndex > 0)
                            {
                                path1 = System.Environment.GetEnvironmentVariable(envvar);
                            }
                            logger.setLogPath(path1 + "" + npath + "\\terminalws.log");
                        }


                    }
                }
                
            }
            catch (Exception generic)
            {
                Console.WriteLine("File configurazione assente: " + generic.Message);
                //NB: non è necessaria l'eccezione in quanto proseguo con il ragionamento sul default
                //Environment.ExitCode = 1;
               //System.Windows.Forms.MessageBox.Show("File configurazione assente: " + generic.Message, "APPLICATION ERROR", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
               //throw new Exception("File configurazione assente: " + generic.Message);
            }
            finally 
            {
                if (file != null)
                {
                    file.Close();
                }                
            }
        }
    }
}
